package com.gitee.huanminabc.jcommon.file;

import com.gitee.huanminabc.jcommon.container.ByteArrayUtil;
import com.gitee.huanminabc.jcommon.exception.CommonException;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.util.function.Function;

/**
 * 简要描述
 *
 * @Author: huanmin
 * @Date: 2025/7/7 22:27
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
public class FileReadWriteUtil {



    /**
     * 二进制读写文件 ,每次读取size个byte,然后进行处理,然后写入到文件中
     *
     * @param filePath       读取的文件路径
     * @param writePath      写入的文件
     * @param append         是否是追加的方式 , true 追加方式, false覆盖方式
     * @param size           每次读取多少byte (int)
     * @param handle         读写中处理

     */
    public static void readWriteByteHandle(
            File filePath,
            File writePath,
            boolean append,
            int size,
            Function<byte[],byte[]> handle) {
        try (BufferedInputStream fis = new BufferedInputStream(Files.newInputStream(filePath.toPath()));
             BufferedOutputStream fos =
                     new BufferedOutputStream(new FileOutputStream(writePath, append));) {

            byte[] data = new byte[size];
            int len;
            while ((len = fis.read(data)) != -1) {
                if (len < size) {//表示读取到了文件的末尾,那么需要进行数组的调整,不然会出现乱码
                    data = ByteArrayUtil.getActualBytes(data);
                }
                // 处理函数
                byte[] apply = handle.apply(data);
                // 获取处理后的数组实际的长度
                fos.write(apply, 0, apply.length); // 写入数据
                data = new byte[size]; // 清空数组
            }
        } catch (Exception e) {
            throw new CommonException(e);
        }
    }
}
